home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Genie / Projects / AEA / Source / Sources / Tokens / AEAMetatoken.cc next >
Encoding:
C/C++ Source or Header  |  2000-06-24  |  1.5 KB  |  106 lines

  1. /*    ===============
  2.  *    AEAMetatoken.cc
  3.  *    ===============
  4.  */
  5.  
  6. #include "AEADebugging.h"
  7.  
  8. #include <Errors.h>
  9.  
  10. #include "AEAMetatoken.hh"
  11. #include "AEAToken.hh"
  12. #include "AEATokenDesc.hh"
  13. #include "AEATokenDescList.hh"
  14. #include "AEATokenModel.hh"
  15.  
  16. // AEAMetatokenX
  17.  
  18. AEAMetatokenX::AEAMetatokenX(AEAToken &inToken)
  19. : mToken(&inToken), refCount(1), owned(true)
  20. {
  21.  
  22. }
  23.  
  24. AEAMetatokenX::~AEAMetatokenX()
  25. {
  26.     if (owned) {
  27.         delete mToken;
  28.     }
  29. }
  30.  
  31. void
  32. AEAMetatokenX::Retain()
  33. {
  34.     refCount++;
  35. }
  36.  
  37. void
  38. AEAMetatokenX::Release()
  39. {
  40.     if (--refCount == 0) {
  41.         delete this;
  42.     }
  43. }
  44.  
  45.  
  46. // AEAMetatoken
  47.  
  48. AEAMetatoken::AEAMetatoken(AEDesc inAEDesc)
  49. : mX(*new AEAMetatokenX(*NewToken(inAEDesc)))
  50. {
  51.  
  52. }
  53.  
  54. AEAMetatoken::AEAMetatoken(const AEAMetatoken &inMetatoken)
  55. : mX(inMetatoken.mX)
  56. {
  57.     mX.Retain();
  58. }
  59.  
  60. AEAMetatoken::~AEAMetatoken()
  61. {
  62.     mX.Release();
  63. }
  64.  
  65. AEAMetatoken
  66. AEAMetatoken::operator=(const AEAMetatoken &inMetatoken)
  67. {
  68.     throw;
  69. }
  70.  
  71. void
  72. AEAMetatoken::MakeDataDescriptor(AEDesc &outAEDesc)
  73. {
  74.     Ref().MakeDataDescriptor(outAEDesc);
  75. }
  76.  
  77. AEAToken &
  78. AEAMetatoken::Ref()
  79. {
  80.     ThrowIfNULL_(mX.mToken);
  81.     return *mX.mToken;
  82. }
  83.  
  84. AEAToken *
  85. AEAMetatoken::NewToken(const AEDesc &inAEDesc)
  86. {
  87.     AEAToken *token;
  88.     switch (inAEDesc.descriptorType) {
  89.         case typeModelToken:
  90.             //return NewObjectToken(inAEDesc);
  91.             token = **(AEATokenModel ***)inAEDesc.dataHandle;
  92.             break;
  93.         case typeAEList:
  94.             token = new AEATokenDescList(inAEDesc);
  95.             break;
  96.         case typeNull:
  97.             //break;
  98.         default: {
  99.             token = new AEATokenDesc(inAEDesc);
  100.             break;
  101.         }
  102.     }
  103.     //token->Duplicate(inAEDesc);
  104.     return token;
  105. }
  106.